
#%%
import Pop3Mailer
import MailConfig
import EmailParserUtils
from email.parser import Parser as EmailParser
import config
import os


#%%

def create_saved_folder()->str:
    '''
    *****************************
    1. 创建要将附件保存到的文件夹。
    这里是把收到的所有附件统一存放到当前周的周一的日期的目录下
    *****************************
    返回值是保存路径
    '''
    saved_path = config.SAVE_PATH
    if not os.path.exists(saved_path):
        os.makedirs(saved_path)
    return saved_path


#%%

def fetch_mails():
    '''
    *****************************
    2. 从邮箱中拉取所有的邮件
    *****************************
    返回值是（pop3客户端，邮件列表）
    '''
    # 创建pop3客户端以拉取所有邮件
    mail_config_parser = MailConfig.MailConfigParser(config.MAIL_CONFIG_PATH)
    mailer = Pop3Mailer.Pop3Mail(mail_config_parser.get(config.MAIL_PROVIDER))
    mailer.connect() # 连接服务器

    mails = mailer.fetch() # 下载所有邮件

    return (mailer, mails)

#%%
def save_attachment(saved_path:str, mailer, mails:list)->list:
    '''
    *****************************
    3. 保存邮件中的附件并将已经下载附件的邮件删除
    *****************************
    返回值是送了邮件的学生的姓名列表
    '''
    names_received_email = [] # 用于保存发送了邮件的学生的姓名


    for i in range(len(mails)):
        msg = EmailParser().parsestr(mails[i].decode('utf-8', errors='ignore'))

        subject = EmailParserUtils.decode_str(msg['Subject']) # 提取邮件中的主题
        from_email = EmailParserUtils.decode_str(msg['from'])
  
        name = subject

        try:
            ret = EmailParserUtils.save_attachment(msg, saved_path)
            if len(ret) == 0:
                print(subject, "No attachment file")
                continue
            mailer.delete(i+1) # 邮件索引是从1开始计数的。删除相应的邮件
            names_received_email.append(name)

        except Exception as e: 
            print("收到了%s发来的邮件，但是在邮件解析过程中出现了问题" % name)
            print(e)

    return names_received_email


#%%
if __name__ == "__main__":

    saved_path = create_saved_folder()
    
    mailer, mails = fetch_mails()
    names_received_email = save_attachment(saved_path, mailer, mails)
    mailer.quit() # 退出pop3客户端

    


# %%
